/**
 * 桥接模式
 */

// 将抽象部分与它的实现部分分离，使它们都可以独立地变化。它是一种对象结构型模式，又称为柄体模式或接口模式

interface IColor {
    getColor(): string;
}
interface IShape {
    draw(): void;
}

class Red implements IColor {
    getColor() {
        return '红';
    }
}
class Blue implements IColor {
    getColor() {
        return '蓝';
    }
}
class Yellow implements IColor {
    getColor() {
        return '黄';
    }
}
// 在每个形状类中，桥接 IColor 接口

class Rectangle implements IShape {
    private color: IColor | undefined;

    setColor(color: IColor) {
        this.color = color;
    }

    draw() {
        console.log('绘制' + this.color?.getColor() + '矩形');
    }
}
class Round implements IShape {
    private color: IColor | undefined;

    setColor(color: IColor) {
        this.color = color;
    }

    draw() {
        console.log('绘制' + this.color?.getColor() + '圆形');
    }
}
class Triangle implements IShape {
    private color: IColor;
    constructor(color: IColor) {
        this.color = color;
    }

    draw() {
        console.log('绘制' + this.color.getColor() + '三角形');
    }
}

const rectangle = new Rectangle();
rectangle.setColor(new Red());
rectangle.draw();

const round = new Round();
round.setColor(new Blue());
round.draw();

const triangle = new Triangle(new Yellow());
triangle.draw();

// 这时我们再来回顾一下官方定义：将抽象部分与它的实现部分分离，使它们都可以独立地变化。
// 抽象部分指的是父类，对应本例中的形状类，实现部分指的是不同子类的区别之处。
// 将子类的区别方式 —— 也就是本例中的颜色 —— 分离成接口，通过组合的方式桥接颜色和形状，这就是桥接模式，
// 它主要用于 两个或多个同等级的接口
